/*
 * Copyright Hundsun Technologies Inc. All Rights Reserved.
 */

package registry

import (
	"hundsun.com/hsl/hschain/common/config"
	"hundsun.com/hsl/hschain/protos/common"
)

const (
	//Prefix 注册前缀
	Prefix = "/registry"
)

// ModRegKey 模块在注册中心注册时的key，格式：/registry/<ModuleName>/<InternalIP>:<Port>
// 且ModuleID为/<ModuleName>/<InternalIP>:<Port>
type ModRegKey string

//String ...
func (m ModRegKey) String() string {
	return string(m)
}

// ModRegValue 注册中心的模块value
type ModRegValue struct {
	ModuleName          string `yaml:"moduleName"`
	ModuleID            string `yaml:"moduleID"`
	IsMasterStandbyMode bool   `yaml:"isMasterStandbyMode"`

	//模块内网监听地址
	ListenAddress *common.NetworkAddress `json:"listen_address"`

	// 扩展信息
	Extra map[string]interface{} `json:"extra"`
}

// ModRegKV 模块在注册中心注册时的key/value对
type ModRegKV struct {
	Key   *ModRegKey
	Value *ModRegValue
}

// Client 模块注册中心客户端
type Client interface {
	// Key 生成Key
	Key(moduleConfig *config.ModuleConfig) (ModRegKey, error)

	// Init 模块注册中心客户端启动方法
	// 1. 初始化客户端  2. 删除本机(host ip)历史键值  3. 启动监听
	//Init(etcdClient *etcd.Client, internalIP string) error

	// RegisterModule 在模块注册中心注册一个模块实例并开始监听该模块所关注的模块的上下线事件，注册时还会指定TTL(Time To Live)
	// 返回 leaseID
	RegisterModule(key *ModRegKey, currentVal *ModRegValue) (int64, error)

	// RefreshModule 在模块注册中刷新模块实例，即将TTL重置为默认值
	RefreshModule(leaseID int64) error

	// DeregisterModule 在模块注册中心取消一个模块实例注册
	DeregisterModule(key *ModRegKey) error

	// FetchModulesByName 根据模块名称查找实例；模块名为空时，查询所有实例；
	FetchModulesByName(moduleName string) ([]*ModRegKV, error)
}
